#ifndef __STRUCT_LIST_H__
#define __STRUCT_LIST_H__
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include <arpa/inet.h>

typedef int bool;
#define true 1
#define false 0;
typedef struct Data
{
    struct sockaddr_in sockinfo;//客户端接受消息inet_ntoa的socket信息
    unsigned int userid;//不可重复，自动分配
    char username[16];//可重复
}DATA,*pDATA;
//定义链表节点
typedef struct Node
{
    //int data;    //数据域
    DATA data;
    struct Node * pNext; //指针域
} NODE, * PNODE;   //NODE等价于struct Node, PNODE等价于struct Node *

//函数声明
PNODE createLinkList(void);        //创建链表的函数
void traverseLinkList(PNODE pHead);      //遍历链表的函数
int isEmpty(PNODE pHead);        //判断链表是否为空的函数
int getLength(PNODE pHead);        //获取链表长度的函数
int insertElement(PNODE pHead, DATA* val);  //向链表中插入元素的函数，三个参数依次为链表头结点、要插入元素的位置和要插入元素的值
int deleteElement(PNODE pHead, int pos, DATA * pVal); //从链表中删除元素的函数，三个参数依次为链表头结点、要删除的元素的位置和删除的元素的值
int deleteElementBaseUserId(PNODE pHead, unsigned int userid);
DATA* serarchByUserId(PNODE pHead,unsigned int userid);
/**
int main_example(void)
{
    int val;     //用于保存删除的元素
    PNODE pHead = NULL;   //PNODE等价于struct Node *
    pHead = createLinkList(); //创建一个非循环单链表，并将该链表的头结点地址赋给pHead
    traverseLinkList(pHead); //调用遍历链表的函数
    if(isEmpty(pHead))
        printf("链表为空！\n");
    else
        printf("链表不为空！\n");
    printf("链表的长度为：%d\n", getLength(pHead));
//调用冒泡排序函数
    sort(pHead);
//重新遍历
    traverseLinkList(pHead);
//向链表中指定位置处插入一个元素
    if(insertElement(pHead, 4, 30))
        printf("插入成功!插入的元素为：%d\n", 30);
    else
        printf("插入失败!\n");
//重新遍历链表
    traverseLinkList(pHead);
//删除元素测试
    if(deleteElement(pHead, 3, &val))
        printf("元素删除成功!删除的元素是：%d\n", val);
    else
        printf("元素删除失败!\n");

    traverseLinkList(pHead);
    system("pause");
    return 0;
}
*/

#endif // __STRUCT_LIST_H__
